package br.com.LeitorLog.controladores;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import br.com.LeitorLog.basicas.Atributo;
import br.com.LeitorLog.basicas.Item;
import br.com.LeitorLog.gui.util.ConstantesGUI;

/**
 * ControladorItem
 *
 * @since 07/02/2013 15:25:37
 */
public class ControladorItem {
	
	private ArrayList<Item> listaItens = new ArrayList<Item>();
	private boolean erroConversaoData = false;
	
	private String descricao = "";
	private Date dataInclusao = null;
	private String tipo = "";
	private boolean isLeg = false;
	private int score = 0;

	/**
	 * Método que processa a linha de data do log
	 * @param linha
	 */
	private void processarLinhaData(String linha) {
		erroConversaoData = false;
		String[] linhaData = linha.split(" ");
		String[] data = linhaData[0].trim().split("/");
		String[] time = linhaData[1].trim().split(":");
		
		Calendar date = new GregorianCalendar();
		
		try {
			int ano = Integer.parseInt(data[2]);
			int mes = Integer.parseInt(data[1]);
			int dia = Integer.parseInt(data[0]);
			
			int hora = Integer.parseInt(time[0]);
			int min = Integer.parseInt(time[1]);
			int sec = Integer.parseInt(time[2]);
			
			// salvando o date para incluir no banco
			date.set(ano, mes, dia, hora, min, sec);
			dataInclusao = date.getTime();
		} catch (NumberFormatException e) {
			System.out.println("Erro na conversão da data.");
			erroConversaoData = true; 
		}
	}
	
	/**
	 * Método que processa a linha do Item do log
	 * @param linha
	 */
	private void processarLinhaItem(String linha) {
		String[] linhaItem = linha.trim().split("\\.");
		
		tipo = linhaItem[0].split("'")[0].trim();
		descricao = linhaItem[0].split("'")[1].trim();
		
		int pontuacao = 0;
		// se for um item legendario separar a pontuacao da descricao de item legendario.
		if (linhaItem[1].split("=")[1].trim().contains(ConstantesGUI.Mensagens.LEGENDARY)) {							
			isLeg = true;
			String scoreNonLeg = linhaItem[1].split("=")[1].trim().replace(ConstantesGUI.Mensagens.LEGENDARY, "").trim();
			pontuacao = Integer.parseInt(scoreNonLeg);
		} else { // Item não é Legendario
			pontuacao = Integer.parseInt(linhaItem[1].split("=")[1].trim());
			isLeg = false;
		}
		
		score = pontuacao;
	}
	
	/**
	 * Método que processa a linha de atributos do log
	 * @param linha
	 */
	private void processarlinhaAtributos(String linha) {
		String[] linhaAtributos = linha.trim().split("\\.");
		
		for (int i = 0; i < linhaAtributos.length; i++) {
			Atributo atrib = new Atributo();
			
			atrib.setDescricao(linhaAtributos[i].trim().split("=")[0]);
			atrib.setValor(Integer.parseInt(linhaAtributos[i].trim().split("=")[1]));
		}
	}
	
	public void processarLinha(String linha) throws NumberFormatException, Exception {
		
		boolean objetoItemCompleto = false;
		if (!linha.startsWith("=") && linha.trim().length() > 0) {
			if (Character.isDigit(linha.charAt(0)) || Character.isDigit(linha.charAt(1))) {
				objetoItemCompleto = false;	
				processarLinhaData(linha);
			} else {
				// se houve erro na conversão de data, não verificar as proximas linhas até a proxima linha de data
				if (!erroConversaoData) {
					// linha ITEM
					if (linha.startsWith(ConstantesGUI.Itens.JEWELRY) ||
							linha.startsWith(ConstantesGUI.Itens.ARMOR) ||
							linha.startsWith(ConstantesGUI.Itens.OFFHAND) ||
							linha.startsWith(ConstantesGUI.Itens.WEAPONONEHAND) ||
							linha.startsWith(ConstantesGUI.Itens.WEAPONRANGE) ||
							linha.startsWith(ConstantesGUI.Itens.WEAPONTWOHAND)) {
						
						processarLinhaItem(linha);
						
					} else {
						// linha atributos							
						processarlinhaAtributos(linha);							
						objetoItemCompleto = true;
					}
				}
			}
			// se preencheu todos os campos do objeto, imprimir ele
			if (objetoItemCompleto) {
				Item novoItem = new Item(dataInclusao, descricao, isLeg, tipo, score, null);
				
				listaItens.add(novoItem);
			}
		}
	}
	
	public ArrayList<Item> buscarListaItens() {
		return listaItens;
	}
}
